<?php

namespace App\Http\Controllers\FileControllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Models\File;
use App\Models\DataTableModel\Folder;

class FolderFileRenameControllers extends Controller
{
    public function rename(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'id' => 'required|integer',
            'type' => 'required|in:file,folder',
            'new_name' => 'required|string',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 400);
        }

        $id = $request->input('id');
        $type = $request->input('type');
        $newName = $request->input('new_name');

        try {
            if ($type === 'file') {
                $file = File::findOrFail($id);

                // 检查新文件名在同一父文件夹下是否已存在  
                $exists = File::where('file_parent_folder_id', $file->file_parent_folder_id)
                    ->where('file_name', $newName)
                    ->where('id', '<>', $id) // 排除当前文件自身  
                    ->exists();

                if ($exists) {
                    return response()->json(['error' => '文件名已存在'], 409); // 使用HTTP状态码409表示冲突  
                }

                // 更新服务器里面的用户文件
                // 首先获取到文件存储地址
                $filePath = $file->file_name; // 用来存储完整路径的变量
                // 初始就是保存当前文件的父文件夹
                $pr_id = $file->file_parent_folder_id; // 保存当前层级父文件夹id
                while ($pr_id != null) {
                    $pr_folder = Folder::find($pr_id);
                    $filePath = $pr_folder->folder_name . '/' . $filePath;
                    $pr_id = $pr_folder->parent_folder_id;
                }
                // 获取到改名之前的完整路径
                $filePath = '/' . $filePath;
                // 更新文件名
                $sourcePath = storage_path('app/public/UserNetworkDiskFile' . $filePath);
                $destinationPath = str_replace($file->file_name, $newName, $sourcePath);

                if (file_exists($sourcePath)) {
                    if (rename($sourcePath, $destinationPath)) {
                        // 更新数据库中的文件名  
                        $file->file_name = $newName;
                        $file->save();

                        return response()->json(['success' => '文件已成功重命名']);
                    } else {
                        // 处理重命名失败的情况  
                        return response()->json(['error' => '无法重命名文件'], 500);
                    }
                } else {
                    // 处理文件不存在的情况  
                    return response()->json(['error' => '文件不存在'], 404);
                }
            } elseif ($type === 'folder') {
                $folder = Folder::findOrFail($id);

                // 检查新文件夹名在同一父文件夹下是否已存在  
                $exists = Folder::where('parent_folder_id', $folder->parent_folder_id)
                    ->where('folder_name', $newName)
                    ->where('folder_id', '<>', $id) // 排除当前文件夹自身  
                    ->exists();

                if ($exists) {
                    return response()->json(['error' => '文件夹名已存在'], 409); // 使用HTTP状态码409表示冲突  
                }

                // $folderName = $folder->folder_name;
                // $folderPath = $folderName; // 用来存储完整路径的变量
                // $pr_id = $folder->parent_folder_id; // 保存当前层级父文件夹id
                // while ($pr_id != null) {
                //     $pr_folder = Folder::find($pr_id);
                //     $folderPath = $pr_folder->folder_name . '/' . $folderPath;
                //     $pr_id = $pr_folder->parent_folder_id;
                // }
                // $folderPath = '/' . $folderPath;

                $folderName = $folder->folder_name;
                // 根据文件夹父文件夹id循环查找文件夹name，拼接，直到folder表中parent_folder_id=null
                // 更新服务器里面的用户文件夹名称
                // 首先获取到文件夹的存储地址
                // 拼接文件夹路径
                // 拼接文件夹路径
                $folderPath = $folderName; // 用来存储完整路径的变量
                $pr_id = $folder->parent_folder_id; // 保存当前层级父文件夹id
                while ($pr_id != null) {
                    $pr_folder = Folder::find($pr_id);
                    $folderPath = $pr_folder->folder_name . '/' . $folderPath;
                    $pr_id = $pr_folder->parent_folder_id;
                }
                $folderPath = '/' . $folderPath;

                // 更新文件夹名称
                $sourcePath = storage_path('app/public/UserNetworkDiskFile' . $folderPath);
                $destinationPath = str_replace($folderName, $newName, $sourcePath);

                if (file_exists($sourcePath)) {
                    if (rename($sourcePath, $destinationPath)) {
                        // 更新数据库中的文件夹名  
                        $folder->folder_name = $newName;
                        $folder->save();
                        return response()->json(['success' => '文件夹已成功重命名']);
                    } else {
                        // 处理重命名失败的情况  
                        return response()->json(['error' => '无法重命名文件夹'], 500);
                    }
                } else {
                    // 处理文件夹不存在的情况  
                    return response()->json(['error' => '文件夹不存在'], 404);
                }
            } else {
                return response()->json(['error' => '无效的文件类型'], 400);
            }
        } catch (\Exception $e) {
            // 捕获其他异常并处理  
            if (config('app.debug')) {
                // 如果是开发环境，记录详细的异常信息并返回详细的错误给客户端  
                // \Log::error('Exception occurred: ' . $e->getMessage() . PHP_EOL . $e->getTraceAsString());  
                return response()->json([
                    'error' => [
                        'message' => $e->getMessage(), // 具体的错误消息  
                        'file' => $e->getFile(), // 错误发生的文件  
                        'line' => $e->getLine(), // 错误发生的行号  
                        'trace' => explode(PHP_EOL, $e->getTraceAsString()), // 完整的堆栈跟踪（用 PHP_EOL 替换 "\n" 以确保跨平台兼容性）  
                    ],
                ], 500);
            } else {
                // 如果是生产环境，只记录异常信息并返回通用的错误给客户端  
                // \Log::error('Exception occurred: ' . $e->getMessage());  
                return response()->json(['error' => '服务器内部错误，请稍后再试'], 500);
            }
        }
    }
}
